﻿using Onshi.POS.Formularios.Properties;
using Onshi.POS.Formularios.Recursos;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Entidades.Tipos;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Vendedores;
using Onshi.POS.Vendedores.Vistas;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Onshi.POS.Formularios
{
    public partial class Vendedores : FormularioBase, IVendedores
    {
        #region Constructores

        public Vendedores(Boolean esBusqueda)
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            btnSeleccionar.Visible = esBusqueda;
            presentador = new VendedoresPresentador(this);
            procesando = new Procesando();
        }

        #endregion

        #region Atributos

        private Boolean inicializando = true;
        private VendedoresPresentador presentador;
        private Int32 idVendedor;
        private enum MetodoHilo { Inicializar, Actualizar, Eliminar, Habilitar, Nuevo, Modificar };

        #endregion

        #region Propiedades

        public Int32 IdVendedorSeleccionado
        {
            get { return idVendedor; }
        }

        [Browsable(false)]
        public String CampoPersonalizadoFiltro
        {
            get { return txtCampoPersonalizadoFiltro.Text; }
        }

        [Browsable(false)]
        public Int32 IdUsuarioSistema
        {
            get { return Principal.IdUsuarioSistema; }
        }

        [Browsable(false)]
        public List<Int32> IdBarriosFiltros
        {
            get { return ucBarriosFiltro.IdBarriosSeleccionados; }
        }

        [Browsable(false)]
        public String NombreFiltro
        {
            get { return gruFiltroSimple.Visible ? txtNombreFiltroSimple.Text : txtNombreFiltro.Text; }
        }

        [Browsable(false)]
        public List<Vendedor> ListadoVendedores
        {
            set { bsVendedores.DataSource = new SortableList<Vendedor>(value); }
        }

        [Browsable(false)]
        public EnumActivoInactivo EstadoFiltro
        {
            get { return gruFiltroSimple.Visible ? (EnumActivoInactivo)((Byte)cboEstadoFiltroSimple.SelectedValue) : (EnumActivoInactivo)((Byte)cboEstadoFiltro.SelectedValue); }
        }

        [Browsable(false)]
        public Int32 IdVendedor
        {
            get { return idVendedor; }
        }

        [Browsable(false)]
        public Int32 IdRubroVendedorFiltro
        {
            get { return ucRubroVendedorFiltro.IdRubroVendedorSeleccionado; }
        }

        [Browsable(false)]
        public Byte IdTipoComisionVendedorFiltro
        {
            get { return (Byte)cboTipoComisionVendedorFiltro.SelectedValue; }
        }

        [Browsable(false)]
        public String CodigoFiltro
        {
            get { return gruFiltroSimple.Visible ? txtCodigoFiltroSimple.Text : txtCodigoFiltro.Text; }
        }

        [Browsable(false)]
        public Decimal ComisionDesdeFiltro
        {
            get { return ucComisionFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal ComisionHastaFiltro
        {
            get { return ucComisionFiltro.Hasta; }
        }

        [Browsable(false)]
        public Decimal ComisionMaximaDesdeFiltro
        {
            get { return ucComisionMaximaFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal ComisionMaximaHastaFiltro
        {
            get { return ucComisionMaximaFiltro.Hasta; }
        }

        [Browsable(false)]
        public Decimal SaldoDesdeFiltro
        {
            get { return ucSaldoFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal SaldoHastaFiltro
        {
            get { return ucSaldoFiltro.Hasta; }
        }

        [Browsable(false)]
        public String EmailFiltro
        {
            get { return txtEmailFiltro.Text; }
        }

        [Browsable(false)]
        public String SitioWebFiltro
        {
            get { return txtSitioWebFiltro.Text; }
        }

        [Browsable(false)]
        public String DomicilioFiltro
        {
            get { return txtDomicilioFiltro.Text; }
        }

        [Browsable(false)]
        public String TelefonoFiltro
        {
            get { return txtTelefonoFiltro.Text; }
        }

        [Browsable(false)]
        public EnumSiNo ObservacionesFiltro
        {
            get { return (EnumSiNo)((Byte)cboObservacionesFiltro.SelectedValue); }
        }

        [Browsable(false)]
        public EnumSiNo ImagenFiltro
        {
            get { return (EnumSiNo)((Byte)cboImagenFiltro.SelectedValue); }
        }

        #endregion

        #region Metodos

        private void LimpiarFiltro()
        {
            inicializando = true;
            txtCodigoFiltro.Text = String.Empty;
            txtNombreFiltro.Text = String.Empty;
            txtEmailFiltro.Text = String.Empty;
            txtSitioWebFiltro.Text = String.Empty;
            txtDomicilioFiltro.Text = String.Empty;
            txtTelefonoFiltro.Text = String.Empty;
            cboObservacionesFiltro.SelectedValue = (Byte)EnumSiNo.Todos;
            cboEstadoFiltro.SelectedValue = (Byte)EnumActivoInactivo.Todos;
            cboImagenFiltro.SelectedValue = (Byte)EnumSiNo.Todos;
            cboTipoComisionVendedorFiltro.SelectedValue = (Byte)EnumTiposComisionesVendedores.Todos;
            ucComisionFiltro.LimpiarCampos();
            ucComisionMaximaFiltro.LimpiarCampos();
            ucSaldoFiltro.LimpiarCampos();
            ucRubroVendedorFiltro.IdRubroVendedorSeleccionado = (Int32)EnumRubrosVendedores.Todos;
            ucRubroVendedorFiltro.Actualizar();
            ucBarriosFiltro.LimpiarCampos();
            txtCodigoFiltroSimple.Text = String.Empty;
            txtNombreFiltroSimple.Text = String.Empty;
            cboEstadoFiltroSimple.SelectedValue = (Byte)EnumSiNo.Todos;
            inicializando = false;
        }

        private void Filtrar()
        {
            if (!inicializando)
                presentador.Filtrar();
        }

        #endregion

        #region Eventos

        #region Filtro

        private void txtCampoPersonalizadoFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void cboEstadoFiltroSimple_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void txtCodigoFiltroSimple_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void txtNombreFiltroSimple_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void ucComisionFiltro_CambioValor()
        {
            Filtrar();
        }

        private void ucComisionMaximaFiltro_CambioValor()
        {
            Filtrar();
        }

        private void ucSaldoFiltro_CambioValor()
        {
            Filtrar();
        }

        private void txtCodigoFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void txtEmailFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void txtSitioWebFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void txtDomicilioFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void txtTelefonoFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void txtNombreFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void ucRubroVendedorFiltro_RubroVendedorSeleccionado()
        {
            Filtrar();
        }

        private void cboObservacionesFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void cboImagenFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void cboEstadoFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void cboTipoComisionVendedorFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void ucBarriosFiltro_Seleccionado()
        {
            Filtrar();
        }

        #endregion

        private void Vendedores_Load(Object sender, EventArgs e)
        {
            grdVendedores.ScrollBars = ScrollBars.None;
            bgwVendedores.RunWorkerAsync(MetodoHilo.Inicializar);
            procesando.ShowDialog();
        }

        private void btnNuevo_Click(Object sender, EventArgs e)
        {
            if (new VendedoresAltaModificacion().ShowDialog() == DialogResult.OK)
            {
                bgwVendedores.RunWorkerAsync(MetodoHilo.Nuevo);
                procesando.ShowDialog();
            }
        }

        private void btnModificar_Click(Object sender, EventArgs e)
        {
            if (new VendedoresAltaModificacion(((Vendedor)bsVendedores.Current).Id).ShowDialog() == DialogResult.OK)
            {
                bgwVendedores.RunWorkerAsync(MetodoHilo.Modificar);
                procesando.ShowDialog();
            }
        }

        private void btnEliminar_Click(Object sender, EventArgs e)
        {
            if (MessageBox.Show("Los clientes de que posean este vendedor se actualizarán con el predeterminado" + Environment.NewLine + "¿Está seguro que desea eliminar el vendedor?", ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                bgwVendedores.RunWorkerAsync(MetodoHilo.Eliminar);
                procesando.ShowDialog();
            }
        }

        private void btnHabilitar_Click(Object sender, EventArgs e)
        {
            if (MessageBox.Show("¿Está seguro que desea habilitar el vendedor?", ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                bgwVendedores.RunWorkerAsync(MetodoHilo.Habilitar);
                procesando.ShowDialog();
            }
        }

        private void btnActualizar_Click(Object sender, EventArgs e)
        {
            bgwVendedores.RunWorkerAsync(MetodoHilo.Actualizar);
            procesando.ShowDialog();
        }

        private void btnSeleccionar_Click(Object sender, EventArgs e)
        {
            idVendedor = ((Vendedor)bsVendedores.Current).Id;
            DialogResult = DialogResult.OK;
        }

        private void btnSalir_Click(Object sender, EventArgs e)
        {
            Close();
        }

        private void btnLimpiar_Click(Object sender, EventArgs e)
        {
            LimpiarFiltro();
            presentador.Filtrar();
        }

        private void bgwVendedores_DoWork(Object sender, DoWorkEventArgs e)
        {
            try
            {
                switch ((MetodoHilo)e.Argument)
                {
                    case MetodoHilo.Inicializar:

                        presentador.Inicializar();
                        cboObservacionesFiltro.Actualizar();
                        cboEstadoFiltro.Actualizar();
                        cboEstadoFiltroSimple.Actualizar();
                        cboImagenFiltro.Actualizar();
                        cboTipoComisionVendedorFiltro.Actualizar();
                        ucBarriosFiltro.Actualizar();
                        ucSaldoFiltro.Actualizar();
                        ucComisionFiltro.Actualizar();
                        ucComisionMaximaFiltro.Actualizar();
                        break;
                    case MetodoHilo.Actualizar:
                        presentador.Actualizar();
                        break;
                    case MetodoHilo.Eliminar:
                        presentador.Eliminar();
                        break;
                    case MetodoHilo.Habilitar:
                        presentador.Habilitar();
                        break;
                    case MetodoHilo.Nuevo:
                        presentador.Nuevo();
                        break;
                    case MetodoHilo.Modificar:
                        presentador.Modificar();
                        break;
                }
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException(ex.Message);
            }
        }

        private void bgwVendedores_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e)
        {
            inicializando = false;
            procesando.Close();
            if (e.Error != null)
                MessageBox.Show(e.Error.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                actVendedores.Actualizar();
            grdVendedores.ScrollBars = ScrollBars.Both;
        }

        private void grdVendedores_CellFormatting(Object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (bsVendedores.Count > 0 && bsVendedores.Count == grdVendedores.RowCount)
            {
                if (((Vendedor)bsVendedores.List[e.RowIndex]).EstaEliminado)
                    grdVendedores.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightCoral;
                if (grdVendedores.Columns[e.ColumnIndex].Index == colObservaciones.Index)
                {
                    if (((Vendedor)bsVendedores.List[e.RowIndex]).TieneObservaciones)
                        e.Value = Properties.Resources.page_copy;
                }
                else if (grdVendedores.Columns[e.ColumnIndex].Index == colDomicilios.Index)
                {
                    if (((Vendedor)bsVendedores.List[e.RowIndex]).TieneDomicilios)
                        e.Value = Properties.Resources.house;
                }
                else if (grdVendedores.Columns[e.ColumnIndex].Index == colTelefonos.Index)
                {
                    if (((Vendedor)bsVendedores.List[e.RowIndex]).TieneTelefonos)
                        e.Value = Properties.Resources.telephone;
                }
                else if (grdVendedores.Columns[e.ColumnIndex].Index == colImagen.Index)
                {
                    if (((Vendedor)bsVendedores.List[e.RowIndex]).TieneImagen)
                        e.Value = Properties.Resources.picture;
                }
            }
        }

        private void grdVendedores_SelectionChanged(Object sender, EventArgs e)
        {
            if (bsVendedores.Current != null)
            {
                btnSeleccionar.Enabled = true;
                btnImprimir.Enabled = true;
                btnImprimirSimple.Enabled = true;
                var vendedor = (Vendedor)bsVendedores.Current;
                idVendedor = vendedor.Id;
                if (vendedor.Id == (Int32)EnumVendedores.TitularDelComercio)
                {
                    btnModificar.Enabled = false;
                    btnEliminar.Enabled = false;
                    btnHabilitar.Enabled = false;
                }
                else if (vendedor.EstaEliminado)
                {
                    btnModificar.Enabled = true;
                    btnEliminar.Enabled = false;
                    btnHabilitar.Enabled = true;
                }
                else if (!vendedor.EstaEliminado)
                {
                    btnModificar.Enabled = true;
                    btnEliminar.Enabled = true;
                    btnHabilitar.Enabled = false;
                }
                else
                {
                    btnModificar.Enabled = true;
                    btnEliminar.Enabled = true;
                    btnHabilitar.Enabled = true;
                }
            }
            else
            {
                idVendedor = 0;
                btnModificar.Enabled = false;
                btnEliminar.Enabled = false;
                btnHabilitar.Enabled = false;
                btnSeleccionar.Enabled = false;
                btnImprimir.Enabled = false;
                btnImprimirSimple.Enabled = false;
            }
        }

        private void grdVendedores_CellClick(Object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
                if (bsVendedores.Current != null && e.ColumnIndex == colDetalle.Index)
                {
                    var vendedorDetalle = new VendedoresDetalle(((Vendedor)bsVendedores.Current).Id);
                    vendedorDetalle.ShowDialog();
                }
        }

        private void btnLimpiarSimple_Click(Object sender, EventArgs e)
        {
            LimpiarFiltro();
            presentador.Filtrar();
        }

        private void btnActualizarSimple_Click(Object sender, EventArgs e)
        {
            bgwVendedores.RunWorkerAsync(MetodoHilo.Actualizar);
            procesando.ShowDialog();
        }

        private void btnFiltroSimple_Click(Object sender, EventArgs e)
        {
            gruFiltro.Visible = true;
            gruFiltroSimple.Visible = false;
            grdVendedores.Height = grdVendedores.Height - 91;
            grdVendedores.Top = grdVendedores.Top + 91;
            LimpiarFiltro();
            presentador.Filtrar();
        }

        private void btnImprimirSimple_Click(Object sender, EventArgs e)
        {

        }

        private void btnFiltro_Click(Object sender, EventArgs e)
        {
            gruFiltro.Visible = false;
            gruFiltroSimple.Visible = true;
            grdVendedores.Height = grdVendedores.Height + 91;
            grdVendedores.Top = grdVendedores.Top - 91;
            LimpiarFiltro();
            presentador.Filtrar();
        }

        private void btnImprimir_Click(Object sender, EventArgs e)
        {

        }

        #endregion
    }
}